//
//  BaseRequest.h
//  CoolTennisBall
//
//  Created by Coollang on 16/12/8.
//  Copyright © 2016年 CoolLang. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <YTKNetwork/YTKNetwork.h>
#import <AFNetworking/AFNetworking.h>
#import "YFNetError.h"


typedef enum : NSUInteger {
    kNetErrorTipNone,  // 对错误不处理
    kNetErrorTipHUD,   // 吐司提示
    kNetErrorTipOneBtnAlert,// 带一个确定按钮提示弹窗
    kNetErrorTipTwoBtnAlert,// 带YES和NO两个按钮提示弹窗
} kNetErrorTipType;


typedef enum : NSInteger {
    // 七牛
    kQINiuTopicUpImageGetTokenApi = -1,
    
    //  login和User 个人信息相关的接口（10-39）
    kLoginRefreshApi = 10,     // 刷新登录
    kLoginEmailSignUpApi = 11, // 邮箱注册
    kLoginEmailSignInApi = 12, // 邮箱登录
    kLoginPhoneSignInApi = 13, // 手机验证码登录
    kLoginByThirdPart = 14,    // 第三方平台登录，如：微信
    kLoginFaceBookApi = 15,    // facebook登录
    kLoginForgotpasswordApi = 17, // 找回密码
    
    kUserFeedbackApi = 18,     // 用户反馈
    kUserSaveInfoApi = 19,     // 保存个人信息
    kUserGetInfoApi = 20,      // 获取个人信息
    kUserUploadHeadImage = 21, // 上传用户头像
    kUserGetYearHistoryDataApi = 22, // 个人模块，获取用户年月历史累计运动数据
    kUserGetHomeDataApi = 23,       // 个人模块，获取用户统计运动数据
    kUserGetEquipApi = 24, // 个人模块，获取用户装备数据
    KUserSaveEquipApi = 25, // 个人模块,保存用户装备数据
    kUserGetCareerDataListApi = 26,// 个人模块，获取用户生涯列表数据
    kUserDeleteCareerDataApi = 27, // 个人模块，删除用户生涯数据
    kUserAddCareerDataApi = 28,    // 个人模块，添加用户生涯数据
    KUserUploadRactetImageApi = 29, // 上传球拍图片
    KUserUploadShoeImageApi = 30,  // 上传鞋图片
    kUserGetShowMedalApi = 31,     // 获取勋章
    
//    排行榜 （40-69）
    kRankNewGetListAPi = 40,      // 排行榜列表
    kRankNewAddLikeAPi = 42,      // 排行榜点赞
    kRankNewCancelLikeAPi = 43,   // 排行榜取消点赞
    kRankNewGetUserRankInfoAPi = 44, // 点击获取用户排行信息
    
//    训练 （70-99）
    kTrainGetHDTennisCoachListApi = 70, // 获取教练及视频
    kTrainGetOldTennisVideolistAPi = 71, // 老接口，获取网球视频
    KTrainRealTimeGetSearveHistoryAPi = 72,  // 实时训练发球历史数据
    KTrainRealTimeGetForeBackHandHistoryAPi = 73, // 实时训练正反手训练历史数据
    KTrainRealTimeSendSearveAPi = 74,  // 上传实时训练发球数据
    KTrainRealTimeSendForeBackHandAPi = 75, // 上传实时训练正反手数据
    KTrainRealTimeDeleteHistortAPi = 76, // 删除实时训练历史数据
    
//    运动统计(100-129)
    kStatisticGetUserUploadTimeApi = 100,   // 获取用户更新数据时间戳
    kStatisticGetGetHomeSportDataApi = 101, // 获取运动数据
    kStatisticUploadHomeSportDataApi = 102, // 上传主页面数据
    kStatisticGetTargetApi = 103,           // 获取运动目标
    kStatisticSaveTargetApi = 104,          // 保存运动目标
    kStatisticGetRecordDeleteListApi = 105, // 获取已标记为删除的主页运动数据
    kStatisticDeleteSportDataApi = 106,     // 删除或恢复主页某一天数据
    kStatisticGetSportDetailReportAPi = 107,// 获取运动报告
    
    
//    设备 (130-159)
    kSensorBindOemTypeAndMacAPi = 130,      //上传用户连接的设备类型和设备mac
    kSensorGetLastVersionAPi = 131,         // 获取设备版本号
//    朋友圈(160-199)
    kPYQPostTopicAPi = 160,                 // 朋友圈发帖
    kPYQGetTopicListApi = 161,              // 获取帖子列表
    kPYQTopicCommentAPi = 162,              // 回复或评论
    kPYQTopicLikeApi = 163,                 // 点赞帖子
    kPYQTopicCancelLikeApi =164,            // 取消帖子点赞
    kPYQDeleteTopicApi = 165,               // 删帖
    kPYQDeleteTopicCommentApi = 166,           // 删除评论
    
} RequestApiType;


@interface YFBaseRequest : YTKRequest

@property (nonatomic,strong) id responseInfo;

/**
 * 参数:子类可以设置这个参数来设置参数
 * 也可以通过重写'- (id)requestArgument'方法,会优先使用重写的方法
 */
@property (nonatomic, strong) NSDictionary *requestArgumentParma;


/** Api类型 */
@property (nonatomic, assign)RequestApiType apiType;

/** 网络请求错误提示类型 */
@property (nonatomic, assign)kNetErrorTipType netErrorTipType;
/** 网络请求错误 */
@property (nonatomic, strong) NSError *reqError;

+ (NSString *)requestString:(RequestApiType)apiType;

+ (instancetype)requestApiWithType:(RequestApiType)apiType andParam:(id)param;

/** 错误处理
 当此方法返回为Nil 是，会调用系统统一的ret 错误处理方法
 作用: 用于子类重写来处理一些特殊的错误
 */
- (NSError *)disposeRequestErrorWithRet:(NSString *)ret;

@end

#pragma mark - 统一修改请求路径和配置统一参数
@interface YFUrlArgumentsFilter:NSObject <YTKUrlFilterProtocol>
//  实现自己的 URL 拼接工具类
+ (YFUrlArgumentsFilter *)filterWithArguments:(NSDictionary *)arguments;
- (NSString *)filterUrl:(NSString *)originUrl withRequest:(YTKBaseRequest *)request;

@end

#pragma mark - 配置请求缓存文件
@interface YFUrlCacheDirPathFilter:NSObject <YTKCacheDirPathFilterProtocol>
@property (nonatomic, copy) NSString *userId;

+ (YFUrlCacheDirPathFilter *)filterWithArguments:(NSString *)userId;

// 切换用户则使用不同的缓存配置文件
- (NSString *)filterCacheDirPath:(NSString *)originPath withRequest:(YTKBaseRequest *)request;

@end
